home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
051-075
/
scopedisk68
/
calendar2
/
calendar.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-19
|
15KB
|
519 lines
/***************************************************************/
/* Calendar Program */
/* This program opens a window, reads the system date and */
/* displays the current month calendar and date. The mouse */
/* may be used to change the date. Saves date on Exit */
/***************************************************************/
#include <exec/types.h>
#include <exec/devices.h>
#include <exec/io.h>
#include <exec/libraries.h>
#include <devices/timer.h>
#include <functions.h>
#include <intuition/intuition.h>
#include <graphics/gfxmacros.h>
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#define INTUITION_REV 33L
#define GRAPHICS_REV 33L
#define MAXLIN 80
char *mn[12] = {"January","February","March","April","May","June","July",
"August","September","October","November","December"};
short nday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char *Curr_Year = "1984";
char *Time = "12:00";
char s[]="Date 12:00 07-Jul-86";
short CC,CR,da,wk,mo,yr,hr,min,sec;
USHORT pot[2];
short matrix[6][7];
static char *lines[6] = {" ", /* init lines for calendar*/
" ",
" ",
" ",
" ",
" ",
};
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Window *Win;
struct FileHandle *Open();
struct Gadget Cg[8];
struct PropInfo Cinfo[2];
struct Image Cimage[2];
main(argc,argv)
int argc;
char *argv[];
{
struct IntuiMessage *message;
struct Gadget *gad;
ULONG class,code, x,y;
BOOL Quit,Save,Memo,GadFlag;
USHORT ID;
float real;
short dx,dy,wkdy,maxday;
VOID show_month(),Last_Time(),show_day(),FrameIt(),Point_Block();
VOID Reset_Date(),Show_Time(),Show_Help(),OpenAll(),Make_Prop_Gadget(),
Make_BOOL_Gadget(),Get_Hours(),Get_Minutes(),Tag(),Reminders(),
Set_Time();
short day_of_week(),set_days(),Get_Month();
long Convert();
Last_Time();OpenAll();FrameIt(Win);
maxday=set_days(mo+1,yr);wkdy=day_of_week(mo,yr);
show_month(da,mo,yr,maxday,wkdy);
Show_Time(0);Point_Block(CC,CR);
if (argc<2) OffGadget(&Cg[7],Win,NULL);
for (Quit=FALSE,Save=TRUE,Memo=FALSE,GadFlag=FALSE;!Quit;) {
while (!(message=GetMsg(Win->UserPort))) WaitPort(Win->UserPort);
class = message->Class; code = message->Code;
x = message->MouseX; y = message->MouseY;
gad = (struct Gadget *)message->IAddress;
ReplyMsg( message );
switch ( class ) {
case CLOSEWINDOW: Quit=TRUE;Save=FALSE;break;
case GADGETDOWN: ID=gad->GadgetID;GadFlag=TRUE;
if (ID>5) {
Quit=TRUE;if (ID==7) Memo=TRUE;
} else if (ID>1) {
switch(ID) {
case 2: yr--;break;
case 3: yr++;break;
case 4: mo--;if (mo<0) { yr--;mo=11; }
if (da>nday[mo]) da=nday[mo];
break;
case 5: mo++;if (mo>11) { yr++;mo=0; }
if (da>nday[mo]) da=nday[mo];
break;
}
maxday=set_days(mo+1,yr);
wkdy=day_of_week(mo,yr);
Point_Block(CC,CR);
show_month(da,mo,yr,maxday,wkdy);
Point_Block(CC,CR);
}
break;
case MOUSEBUTTONS: if (code==SELECTDOWN && y>47 && y<121) {
dx=(x-6)/24;dy=(y-50)/10;
if (dx<0) dx=0;if (dx>6) dx=6;
if (dy<0) dy=0;if (dy>5) dy=5;
if (matrix[dy][dx]) {
Point_Block(CC,CR);Point_Block(dx,dy);
CC=dx;CR=dy;da=matrix[dy][dx];
}
GadFlag=FALSE;
}
break;
case MOUSEMOVE:if (ID<2 && GadFlag && Cinfo[ID].HorizPot!=pot[ID]){
real=(Cinfo[ID].HorizPot+1.0)/65536.0;
if (ID==0) hr=real*24; else min=real*60;
pot[ID]=Cinfo[ID].HorizPot;Show_Time();
}
}
}
CloseWindow(Win);
if (yr>1978 && Save) {
Reset_Date();Set_Time(Convert());Tag();
if (Memo && argc==2) Reminders(argc,argv);
}
}
VOID Tag() /* Write File with current date to S: */
{
struct FileHandle *out;
if ((out=Open("S:now",1006L)) != NULL) {
Write(out,&s,(long)strlen(s));Close(out);
} else printf("Can't update S:now !!!\n");
}
VOID Reminders(num,arg) /* Display Reminders */
int num;
char *arg[];
{
FILE *in;
char line[MAXLIN];
short min,max,day,month,time,cnt,sw,a1,a2;
if (da<6) min=(mo-1)*100+(nday[mo-1]+da-5);
else min=mo*100+da-5;
if ((da+10)>nday[mo]) max=(mo+1)*100+(da+10-nday[mo]);
else max=mo*100+da+10;
if (min<1) min=1;
if (max>1131) max=1131;sw=1;
if ((in=fopen(arg[1],"r")) != NULL) {
while (fgets(line,MAXLIN,in) != NULL) {
day=line[0]-48;
if (day<1) day=0;
if (line[1] != 32) {
day=day*10+line[1]-48;
cnt=3;
} else cnt=2;
month=Get_Month(line[cnt],line[cnt+1],line[cnt+2])-1;
time=month*100+day;
if ((time>=min) && (time<=max)) {
if (sw) {
printf("\n");
printf("%2d %-13sReminders\n",da,mn[mo]);
printf("-----------------------------------\n");
sw=0;
}
printf(line);
}
}
fclose(in);
} else printf("%s file not available...\n",arg[1]);
printf("\n");
}
short Get_Month(a,b,c) /* Convert Alpha Month to Number */
short a,b,c;
{
short val;
if (a>96) a-=32;
if (b>96) b-=32;
if (c>96) c-=32;
switch (a) {
case 65: if (b==80) val=4; else val=8;
break;
case 68: val=12;break;
case 70: val=2;break;
case 74: if (b==65) val=1;
else if (c==78) val=6; else val=7;
break;
case 77: if (c==82) val=3; else val=5;
break;
case 78: val=11;break;
case 79: val=10;break;
case 83: val=9;break;
}
return val;
}
VOID OpenAll() /* Open everything */
{
struct NewWindow nw;
USHORT i;
float real;
if (!(IntuitionBase=(struct IntuitionBase *)
OpenLibrary("intuition.library",INTUITION_REV))) {
printf("Intuition Open failed.\n");
exit(FALSE);
}
if (!(GfxBase=(struct GfxBase *)
OpenLibrary("graphics.library",GRAPHICS_REV))) {
printf ("graphics open failed.\n");
exit(FALSE);
}
nw.LeftEdge=232; nw.TopEdge=12; nw.Width=178;
nw.Height=144; nw.DetailPen=0x00; nw.BlockPen=0x01;
nw.Title=(UBYTE *)" Calendar ";
nw.Flags=ACTIVATE|SMART_REFRESH|WINDOWCLOSE|WINDOWDRAG|
WINDOWDEPTH|REPORTMOUSE;
nw.IDCMPFlags=CLOSEWINDOW|MOUSEBUTTONS|MOUSEMOVE|GADGETDOWN|GADGETUP;
nw.Type=WBENCHSCREEN; nw.FirstGadget=&Cg[0]; nw.CheckMark=NULL;
nw.Screen=NULL; nw.BitMap=NULL; nw.MinWidth=100;
nw.MinHeight=60; nw.MaxWidth=640; nw.MaxHeight=200;
real=(float)hr/24.0;pot[0]=real*65536+1;
real=(float)min/60.0;pot[1]=real*65536+1;
Make_Prop_Gadget(&Cg[0],8,120,80,7,&Cinfo[0],&Cimage[0],pot[0]);
Cg[0].NextGadget=&Cg[1];
Make_Prop_Gadget(&Cg[1],90,120,80,7,&Cinfo[1],&Cimage[1],pot[1]);
Cg[1].NextGadget=&Cg[2];
Make_BOOL_Gadget(&Cg[2],9,14,48,8);Cg[2].NextGadget=&Cg[3];
Make_BOOL_Gadget(&Cg[3],120,14,48,8);Cg[3].NextGadget=&Cg[4];
Make_BOOL_Gadget(&Cg[4],9,24,48,8);Cg[4].NextGadget=&Cg[5];
Make_BOOL_Gadget(&Cg[5],120,24,48,8);Cg[5].NextGadget=&Cg[6];
Make_BOOL_Gadget(&Cg[6],9,130,76,8);Cg[6].NextGadget=&Cg[7];
Make_BOOL_Gadget(&Cg[7],93,130,76,8);
for (i=0;i<8;i++) Cg[i].GadgetID=i;
Win=(struct Window *)(OpenWindow(&nw));
}
VOID Make_Prop_Gadget(g,l,t,w,h,info,image,pot)
struct Gadget *g;
USHORT l,t,w,h;
USHORT pot;
struct Image *image;
struct PropInfo *info;
{
info->Flags=AUTOKNOB|FREEHORIZ;
info->VertPot=0L; info->HorizPot=(ULONG)pot;
info->HorizBody=1L; info->VertBody=1L;
g->NextGadget=NULL; g->LeftEdge=l; g->TopEdge=t;
g->Width=w; g->Height=h;
g->Flags=GADGHCOMP|SELECTED;
g->Activation=GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY;
g->GadgetType=PROPGADGET; g->GadgetRender=(APTR)image;
g->SelectRender=NULL; g->GadgetText=NULL; g->MutualExclude=NULL;
g->SpecialInfo=(APTR)info; g->GadgetID=NULL; g->UserData=NULL;
}
VOID Make_BOOL_Gadget(g,l,t,w,h)
struct Gadget *g;
USHORT l,t,w,h;
{
g->NextGadget=NULL; g->LeftEdge=l; g->TopEdge=t;
g->Width=w; g->Height=h;
g->Flags=GADGHCOMP;
g->Activation=GADGIMMEDIATE;
g->GadgetType=BOOLGADGET; g->GadgetRender=NULL;
g->SelectRender=NULL; g->GadgetText=NULL; g->MutualExclude=NULL;
g->SpecialInfo=NULL; g->GadgetID=NULL; g->UserData=NULL;
}
void Reset_Date() /* Reset Date String to Current Date */
{
hr %=24;
s[5]=(hr/10)+48;
s[6]=(hr%10)+48;
s[8]=(min/10)+48;
s[9]=(min%10)+48;
s[11]=(da/10)+48;
s[12]=(da%10)+48;
s[14]=mn[mo][0];
s[15]=mn[mo][1];
s[16]=mn[mo][2];
s[18]=((yr%100)/10)+48;
s[19]=(yr%10)+48;
}
void Show_Time(x) /* Display Time */
short x;
{
short h,i,morn;
if (min>59) min=min-60;
if (min<0) min=60+min;
if (hr>24) hr=hr-24;
if (hr<1) hr=24+hr;
if (hr>12) h=hr-12; else h=hr;
Time[0]=(h/10)+48;
Time[1]=(h%10)+48;
Time[3]=(min/10)+48;
Time[4]=(min%10)+48;
Move(Win->RPort,69L,118L);
Text(Win->RPort,Time,5L);
Move(Win->RPort,118L,118L);
SetAPen(Win->RPort,3L);
if ((hr>11) && (hr<24)) Text(Win->RPort,"PM",2L);
else Text(Win->RPort,"AM",2L);
SetAPen(Win->RPort,1L);
}
void Point_Block(nx,ny) /* Draw Cursor Square around Day */
SHORT nx,ny;
{
LONG x,y;
x=nx*24+7;y=ny*10+58;
SetDrMd(Win->RPort,COMPLEMENT);
Move(Win->RPort,x+1,y);
Draw(Win->RPort,x+19,y);
Draw(Win->RPort,x+19,y-10);
Draw(Win->RPort,x,y-10);
Draw(Win->RPort,x,y);
SetDrMd(Win->RPort,JAM2);
}
void FrameIt(w) /* Draw Frame for Calendar Window */
struct Window *w;
{
short i;
SetDrMd(Win->RPort,JAM2);
SetAPen(Win->RPort,3L);
Move(w->RPort,5L,12L);
Draw(w->RPort,172L,12L);
Draw(w->RPort,172L,141L);
Draw(w->RPort,5L,141L);
Draw(w->RPort,5L,12L);
Move(w->RPort,5L,35L);
Draw(w->RPort,172L,35L);
Move(w->RPort,5L,109L);
Draw(w->RPort,172L,109L);
Move(w->RPort,5L,128L);
Draw(w->RPort,172L,128L);
Move(w->RPort,89L,128L);
Draw(w->RPort,89L,141L);
SetAPen(Win->RPort,1L);
RectFill(Win->RPort,9L,130L,85L,139L);
RectFill(Win->RPort,93L,130L,168L,139L);
Move(Win->RPort,22L,118L);Text(Win->RPort,"Time",4L);
SetAPen(Win->RPort,2L);
Move(Win->RPort,9L,32L);
Text(Win->RPort," <<<< >>>> ",20L);
Move(Win->RPort,9L,22L);
Text(Win->RPort," <<<< >>>> ",20L);
SetBPen(Win->RPort,1L);
Move(Win->RPort,15L,137L);Text(Win->RPort,"Set Date",8L);
Move(Win->RPort,98L,137L);Text(Win->RPort,"Memo/Set",8L);
SetBPen(Win->RPort,0L);
}
void Last_Time() /* Read the System Date and Time */
{
struct tm *localtime(),*tstruct;
long tloc,time(),t;
short i;
tloc=time();
tstruct=localtime(&tloc);
mo=tstruct->tm_mon;
yr=tstruct->tm_year+1900;
da=tstruct->tm_yday;
wk=tstruct->tm_wday;
hr=tstruct->tm_hour;
min=tstruct->tm_min;
sec=tstruct->tm_sec;
for (i=0;i<mo;i++) da -= nday[i];
if (da<1) {
mo-=1;da=nday[mo];
}
}
short day_of_week(mo,yr) /* Calculate the Day of the Week */
short mo,yr;
{
float r;
short i,j,k,l;
r=365.0*yr+1+31.0*mo;mo=mo+1;
if (mo>2) {
i=0.4*mo+2.3;j=yr/4;k=yr/100;l=0.75*(k+1);
r=r-i+j-l;
} else {
i=(yr-1)/4;j=(yr-1)/100;k=0.75*(j+1);
r=r+i-k;
}
r=r-273750.0;
j=(-1.0*r)/7.0;i=r+j*7.0;
if(i==7) i=0;
return i;
}
void show_month(da,mo,yr,mxday,wkday) /* Display Day, Month, Year */
short da,mo,yr,mxday,wkday;
{
short cnt,row,i,j,x,y;
for (i=0;i<6;i++) {
for (j=0;j<7;j++) {
matrix[i][j]=0;
lines[i][j*3]=32;
lines[i][j*3+1]=32;
}
}
Move(Win->RPort,49L,32L);
Text(Win->RPort," ",10L);
SetAPen(Win->RPort,1L);
i=(178-strlen(mn[mo])*8)/2;
Curr_Year[0]=(yr/1000)+48;
Curr_Year[1]=((yr%1000)/100)+48;
Curr_Year[2]=((yr%100)/10)+48;
Curr_Year[3]=yr%10+48;
Move(Win->RPort,73L,22L);
Text(Win->RPort,Curr_Year,4L);
Move(Win->RPort,(long)i,32L);
Text(Win->RPort,mn[mo],(long)strlen(mn[mo]));
Move(Win->RPort,9L,46L);
SetAPen(Win->RPort,3L);
Text(Win->RPort," S M T W T F S",20L);
cnt=wkday;row=0;
for (i=1;i<(mxday+1);i++) {
if (i==da) {
CR=row;CC=cnt;
}
if (i>9) lines[row][cnt*3]=(i/10)+48;
else lines[row][cnt*3]=32;
lines[row][cnt*3+1]=(i%10)+48;
matrix[row][cnt]=i;
cnt++;
if (cnt==7 && i<mxday) {
cnt=0;row++;
}
}
SetAPen(Win->RPort,1L);
for (i=0;i<6;i++) {
Move(Win->RPort,9L,(long)(i*10+56));
Text(Win->RPort,lines[i],20L);
}
}
short set_days(mo,yr) /* Check for Leap Year */
short mo,yr;
{
short norm;
if (mo==1 || mo==3 || mo==5 || mo==7 || mo==8 || mo==10 || mo==12)
return 31;
else if (mo==4 || mo==6 || mo==9 || mo==11)
return 30;
else {
norm = 1;
if ((yr % 4) == 0) norm = 0;
if ((yr % 100) == 0) norm = 1;
if ((yr % 400) == 0) norm = 0;
if (norm) return 28;
else return 29;
}
}
VOID Set_Time(secs) /* Set System Clock */
long secs;
{
struct timerequest *time_req;
struct timerequest *CreateExtIO();
struct MsgPort *timer_port;
long error;
timer_port = CreatePort( 0L, 0L );
if ( ! timer_port ) exit( 1L );
time_req=CreateExtIO(timer_port,(long)sizeof(struct timerequest));
if (time_req==NULL) exit(1L);
error = OpenDevice (TIMERNAME,UNIT_MICROHZ,time_req,0L);
if( error ) {
DeleteExtIO(time_req,(long)sizeof(struct timerequest));
DeletePort( timer_port );
exit( 2L );
}
time_req -> tr_node.io_Message . mn_ReplyPort = timer_port;
time_req -> tr_node.io_Command = TR_SETSYSTIME;
time_req -> tr_time.tv_secs = secs;
time_req -> tr_time.tv_micro = 0L;
DoIO( time_req );
CloseDevice( time_req );
DeleteExtIO(time_req,(long)sizeof(struct timerequest));
DeletePort( timer_port );
}
long Convert() /* Convert Time to Seconds */
{
long secs,years,days;
short i;
years=yr-1978;
if (years<0) return(0L);
for (i=0,days=0;i<mo;i++) days+=nday[i];
days+=da-1;
if (yr>1979) {
days+=((yr-1980)/4)+1;
if (((yr-1980)%4)==0 && mo<2) days--;
}
secs=(years*365+days)*86400+(long)hr*3600+min*60+sec;
return(secs);
}